package com.dingding.common.core.util;

import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.dingding.common.core.base.dto.RequestEntity;
import com.dingding.common.core.base.dto.ResponseEntity;

/**
 * 
 * @ClassName: JSONUtil
 * @Description:JSON解析工具类 当前工程所有的JSON解析获取统一使用当前工具类，JSON解析所用的的技术是fastjson
 * @author cheshaowei
 * @date 2015-7-1 下午03:29:41
 * @version 叮叮搭车V2.0
 * 
 */
@SuppressWarnings("all")
public class JSONUtil {

	/**
	 * 
	 * @Title: parse @Description: 把JSON文本parse为JSONObject或者JSONArray @param
	 *         待转换的json @return 转换后的JSONObject或者JSONArray @author
	 *         cheshaowei @return Object @throws
	 * 
	 */
	public static final Object parse(String json) {
		// 此处无需作空判断，parse()已经作空判断
		Object object = JSON.parse(json);
		return object;
	}

	/**
	 * 
	 * @Title: parseObject @Description: 把JSON文本parse成JSONObject @param
	 *         待转换的json @author cheshaowei @return JSONObject @throws
	 * 
	 */
	public static final JSONObject parseObject(String json) {
		// 此处无需作空判断，parseObject()已经作空判断
		JSONObject jsonObject = JSON.parseObject(json);
		return jsonObject;
	}

	/**
	 * 
	 * @Title: parseObject @Description: 把JSON文本parse为JavaBean @param
	 *         待转换的json @param clazz 要转换成的javabean类型 @author cheshaowei @return
	 *         T @throws
	 * 
	 */
	public static final <T> T parseObject(String json, Class<T> clazz) {
		// 此处无需作空判断，parseObject()已经作空判断
		T t = (T) JSON.parseObject(json, clazz);
		return t;
	}

	/**
	 * 
	 * @Title: parseArray @Description: 把JSON文本parse成JSONArray @param
	 *         待转换的json @author cheshaowei @return JSONArray @throws
	 * 
	 */
	public static final JSONArray parseArray(String json) {
		JSONArray jsonArray = JSON.parseArray(json);
		return jsonArray;
	}

	/**
	 * 
	 * @Title: parseArray @Description: 把JSON文本parse成JavaBean集合 @param
	 *         <T> @param 待转换的json @param clazz 要转换成的javabean类型 @return @author
	 *         cheshaowei @return List<T> @throws
	 */
	public static final <T> List<T> parseArray(String json, Class<T> clazz) {
		List<T> list = JSON.parseArray(json, clazz);
		return list;
	}

	/**
	 * 
	 * @Title: toJSONString @Description: 将JavaBean序列化为JSON文本 @param object
	 *         待转换的javabean对象 @return String 转换后的json字符串 @author
	 *         cheshaowei @return String @throws
	 * 
	 */
	public static final String toJSONString(Object object) {
		String jsonStr = JSON.toJSONString(object);
		return jsonStr;
	}

	/**
	 * 
	 * @Title: toJSONString @Description: 将JavaBean序列化为带格式的JSON文本 @param object
	 *         待转换的javabean @param prettyFormat @return String
	 *         转换后的json字符串 @author cheshaowei @return String @throws
	 * 
	 */
	public static final String toJSONString(Object object, boolean prettyFormat) {
		String jsonStr = JSON.toJSONString(object, prettyFormat);
		return jsonStr;
	}

	/**
	 * 
	 * @Title: toJSON @Description: 将JavaBean转换为JSONObject或者JSONArray @param
	 *         javaObject @author cheshaowei @return Object @throws
	 */
	public static final Object toJSON(Object javaObject) {
		Object object = JSON.toJSON(javaObject);
		return object;
	}

	/**
	 * @Description: 获取客户端请求body
	 * @param clazz
	 *            body的类类型
	 * @author fengshuonan
	 * @return T body的实体bean
	 * @since 2.3.0
	 */
	public static final <T> T getRequestBody(String json, Class<T> clazz) {

		if (ToolUtil.isBlank(json)) {
			return null;
		}

		RequestEntity requestEntity = JSONUtil.parseObject(json, RequestEntity.class);

		if (requestEntity == null) {
			return null;
		}

		JSONObject object = (JSONObject) requestEntity.getRequestBody();

		if (object == null) {
			return null;
		}

		return (T) object.parseObject(object.toJSONString(), clazz);
	}

	/**
	 * 
	 * @Description: 将JSON转换成Map
	 * @param json 待转换的JSON字符串
	 * @author CHEHUANBO
	 * @version V2.6.2
	 * 
	 */
	public static final Map<String, Object> convertJsonStrToMap(String json) {

		Map<String, Object> map = JSON.parseObject(json, new TypeReference<Map<String, Object>>() {
		});

		return map;
	}

	/**
	 * @Description: 获取服务端响应body
	 * @param clazz
	 *            body的类类型
	 * @author fengshuonan
	 * @return T body的实体bean
	 * @since 2.3.0
	 */
	public static final <T> T getResponseBody(String json, Class<T> clazz) {

		ResponseEntity responseEntity = JSONUtil.parseObject(json, ResponseEntity.class);

		JSONObject object = (JSONObject) responseEntity.getResponseBody();

		return (T) object.parseObject(object.toJSONString(), clazz);
	}

	/**
	 * 
	 * @Title: toJSONString @Description:
	 *         将JavaBean序列化为JSON文本，并将时间类型转换成指定格式 @param object 待转换的javabean对象
	 * 
	 * @return String 转换后的json字符串 @author cheshaowei @return String @throws
	 * 
	 */
	public static final String toJSONString(Object object, String dataFormat) {
		String jsonStr = JSON.toJSONStringWithDateFormat(object, dataFormat, SerializerFeature.WriteDateUseDateFormat);
		return jsonStr;
	}
}
